package org.wdcode.back.service.impl;

import java.util.List;
import java.util.Map;

import org.springframework.beans.BeanUtils;


import org.wdcode.common.tools.Conversion;
import org.wdcode.common.tools.Lists;
import org.wdcode.common.tools.Maps;
import org.wdcode.common.util.CommonUtil;
import org.wdcode.back.constants.BackConstants;
import org.wdcode.back.dao.UserDao;
import org.wdcode.back.helper.OperateHelper;
import org.wdcode.back.helper.RoleOperateHelper;
import org.wdcode.back.params.WdBackParams;
import org.wdcode.back.po.RoleOperate;
import org.wdcode.back.po.User;
import org.wdcode.back.po.Operate;
import org.wdcode.back.service.LoginService;

/**
 * 登录业务接口实现
 * @author WD
 * @since JDK6
 * @version 1.0 2009-07-14
 */
public class LoginServiceImpl implements LoginService {
	// 用户管理Dao
	private UserDao	userDao;

	/**
	 * 登录方法
	 * @param user 用户实体
	 * @return true 成功 false 失败
	 */
	public boolean login(User user) {
		// 查询获得用户实体
		User man = userDao.get(user);

		// 判断用户是否存在
		if (!CommonUtil.isEmpty(man) && Conversion.toInt(man.getId()) > 0) {
			// 判断用户名和密码相等
			if (user.getName().equals(man.getName()) && user.getPassword().equals(man.getPassword())) {
				// 把新用户实体赋值给传进来的参数对象
				BeanUtils.copyProperties(man, user);
				// 返回成功
				return true;
			}
		}
		// 返回失败
		return false;
	}

	/**
	 * 根据角色ID 获得权限操作列表
	 * @param roleId 角色ID
	 * @return 权限操作列表
	 */
	public List<Integer> getOperate(int roleId) {
		// 获得全部操作列表ID
		List<Integer> lsOperateIds = OperateHelper.getHelper().getKeys();
		// 0 为全部权限
		if (roleId == WdBackParams.getRoleAll()) {
			// 获得所有权限
			return lsOperateIds;
		} else {
			// 根据根据角色ID获得角色下的操作ID列表
			return getOperateIds(roleId);
		}
	}

	/**
	 * 获得用户操作菜单
	 * @param lsOperateIds 权限操作列表
	 * @return 用户操作菜单
	 */
	public Map<Integer, List<Integer>> getMenu(List<Integer> lsOperateIds) {
		// 判断如果操作列表为空
		if (CommonUtil.isEmpty(lsOperateIds)) {
			// 返回一个空的不可变的Map
			return Maps.emptyMap();
		}
		// 声明列表保存MapKey
		List<Integer> lsKey = getMenuKey(lsOperateIds);
		// 返回菜单
		return getMenu(lsKey, lsOperateIds);
	}

	/**
	 * 获得菜单ID列表
	 * @param lsIds 操作列表ID
	 * @return 菜单名列表
	 */
	private List<Integer> getMenuKey(List<Integer> lsIds) {
		// 保存字符串菜单变量
		int menu = 0;
		// 声明列表保存MapKey
		List<Integer> lsKey = Lists.getList();
		// 保存列表大小
		int size = lsIds.size();
		// 循环操作列表
		for (int i = 0; i < size; i++) {
			// 获得所属菜单
			menu = OperateHelper.getHelper().get(lsIds.get(i)).getMenuId();
			// 判断列表中没有
			if (!lsKey.contains(menu)) {
				// 添加到列表中
				lsKey.add(menu);
			}
		}
		// 返回MapKey
		return lsKey;
	}

	/**
	 * 获得菜单
	 * @param lsKey Key列表
	 * @param lsIds 操作列表
	 * @return 菜单Map
	 */
	private Map<Integer, List<Integer>> getMenu(List<Integer> lsKey, List<Integer> lsIds) {
		// 保存列表大小
		int size = lsKey.size();
		// 保存操作列表大小
		int len = lsIds.size();
		// 实例化菜单map
		Map<Integer, List<Integer>> mapMenu = Maps.getMap(size);
		// 声明操作类 保存列表中变量
		Operate operate = null;
		// 声明操作列表
		List<Integer> list = null;
		// 保存字符串菜单变量
		int menu = 0;
		// 循环MapKey
		for (int i = 0; i < size; i++) {
			// 获得key
			menu = lsKey.get(i);
			// 实例化列表
			list = Lists.getList();
			// 循环操作列表
			for (int j = 0; j < len; j++) {
				// 获得操作
				operate = OperateHelper.getHelper().get(lsIds.get(j));
				// 判断是否是这个key 并且要显示的菜单
				if (operate.getDisplay() == BackConstants.DISPLAY_SHOW && menu == operate.getMenuId()) {
					// 添加到列表中
					list.add(operate.getId());
				}
			}
			// 添加到Map中
			mapMenu.put(menu, Lists.sort(list));
		}
		// 返回菜单
		return mapMenu;
	}

	/**
	 * 获得用户管理Dao
	 * @return 用户管理Dao
	 */
	public UserDao getUserDao() {
		return userDao;
	}

	/**
	 * 设置用户管理Dao
	 * @param userDao 用户管理Dao
	 */
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}

	/**
	 * 根据角色ID获得角色下的操作ID列表
	 * @param roleId 角色ID
	 * @return 操作ID列表
	 */
	private List<Integer> getOperateIds(int roleId) {
		// 获得全部角色与操作
		Map<Integer, RoleOperate> map = RoleOperateHelper.getHelper().getCache().getCaches();
		// 声明操作ID列表
		List<Integer> lsIds = Lists.getList(map.size());
		// 角色与操作关系实体 保存循环获得的变量
		RoleOperate ro = null;

		// 循环Map
		for (Map.Entry<Integer, RoleOperate> e : map.entrySet()) {
			// 获得角色与操作关系实体
			ro = e.getValue();
			// 判断是否是这个角色的操作
			if (roleId == ro.getRoleId()) {
				// 是添加到列表中
				lsIds.add(ro.getOperateId());
			}
		}
		// 返回列表
		return lsIds;
	}
}